﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleDelete
{
    /// <summary>
    /// 通俗的理解是，委托其实可以是一种简单的约束，
    /// 好比在工作上我声明了一个委托人A, A同时可以接受(人力资源，后勤公务)两个参数，
    /// 那么只要是有人想处理（人力资源，后勤）方面的事情，都可以去注册到委托人A上，
    /// A有能力接受这些方法，然后去处理。
    /// 
    /// 
    /// 下面是一个计算方法，声明了一个委托CalculatorDelegate，
    /// 然后在Main方法里面先后注册了AddNum，和SumNum方法，
    /// 注册的方法必须与委托的参数以及返回类型相符合，
    /// 否者将会提示【委托与注册方法不匹配的提示】对于这块是直接编译无法通过的。
    /// 委托如果被注册了多个方法，称为多播。
    /// 对于多播，调用委托后，按照注册顺序执行。
    /// 不过对于有返回值的方法，将返回最后注册的方法执行后的返回值。

    /// Notes：第一次注册方法的时候可以使用【=注册】或者【new CalculatorDelegate(方法名) 】,
    /// 后面添加方法用【+】,取消注册方法用【-】
    /// 
    /// </summary>
    /// <param name="num1"></param>
    /// <param name="num2"></param>
    /// <returns></returns>
    public delegate double CalculatorDelete(double num1,double num2);//委托，声明在类之外
    public class Program
    {
        public static double AddNum(double num1, double num2)
        {
            Console.WriteLine("Sum={0}",num1+num2);
            return num1 + num2;
        }

        public static double SubNum(double num1, double num2)
        {
            Console.WriteLine("Sub={0}", num1- num2);
            return num1 - num2;
        }

        static void Main(string[] args)
        {
            //int 类型的变量用来赋值整数的，string类型的变量用来赋值字符串的，而委托类型的变量是用来赋值函数的。
            CalculatorDelete calculate = AddNum;
            Console.WriteLine("委托一个方法的结果为:{0}",calculate(1,2));
            calculate += SubNum;
            Console.WriteLine("委托两个方法的结果为:{0}", calculate(1, 2));
            Console.ReadKey();
        }
    }
}
